<?php
class Zax_Module_Conf
{
	public $_cache;
	private $conf;

	
	/**
	 * Charge un groupe de configuration
	 * Automatise la lecture d'un fichier de configuration système et
	 * définit les constantes.
	 * @param $group
	 * @return unknown_type
	 */
	public function load($group)
	{
		static $loaded;
		if (isset($loaded[$group])) return true; 
		
		//Chargement des trois fichiers de configuration pour ce groupe
		$default_conf = $this->parse_conf_file(ZAX_SYSTEM_PATH."/Configuration/$group.conf");
		$user_conf = $this->parse_conf_file(ZAX_DATA_PATH."/Configuration/$group.conf");
		$forced_conf = $this->parse_conf_file(ZAX_DATA_PATH."/Configuration/$group.forced.conf");
		
		$this->conf[$group] = array_merge($default_conf,$user_conf,$forced_conf);
		$this->define_constants_for_group($group);
		
		$loaded[$group] = 1;
		return true;
	}
	
	/**
	 * Parse un fichier de configuration
	 * @param $file
	 * @return array Configuration (paires clé => valeur)
	 */
	public function parse_conf_file($file)
	{
		$file = @file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
		$conf = array();
		
		if ($file)
		{
			foreach ($file as $line)
			{
				if($line{0} !== ';')
				{
					$line = explode('=',$line,2);
					$conf[strtolower(trim($line[0]))] = trim($line[1]);
				}
			}
		}
		
		return $conf;
	}
	
	/**
	 * Convertit un tableau en chaine de configuration
	 * @param $array Tableau à convertir
	 * @param $head_comment (optionel) Commentaire d'en-tête
	 * @return str Chaine de configuration
	 */
	public function array2conf($array,$head_comment = null)
	{
		$conf_str = '';
		$conf_str.= ';'.str_replace("\n",";\n")."\n\n";
		
		foreach($array as $k => $v)
		{
			$v = str_replace(array("\n","\r",),' ',$v);
			$conf_str.= "$k = $v\n";
		}
		
		$conf_str = $conf_str.'\n\n;[Auto-generated:'.time().'-'.md5($conf_str).']';
		
	}
	
	/**
	 * Définit des constantes de la forme CONF_[groupe]_[clé] = valeur
	 * Ainsi, on peut accéder à la configuration à partir 
	 * de n'importe quel contexte.
	 * @param $group Groupe pour lequel on souhaite définir des constantes
	 */
	public function define_constants_for_group($group)
	{
		static $already_defined;
		
		if(isset($already_defined[$group]))
			return true;
		
		foreach ($this->conf[$group] as $k => $v)
		{
			define('CONF_'.strtoupper($group).'_'.strtoupper($k), $v);
		}
		$already_defined[$group] = true;
		
		return true;
	}
}